www.gusucode.com > FreeEIM 飞鸽传书仿QQ即时通讯软件VC++源代码-源码程序 > FreeEIM 飞鸽传书仿QQ即时通讯软件VC++源代码-源码程序\code\WaveOut.cpp
//Download by http://www.NewXing.com // WaveOut.cpp : implementation file // #include "stdafx.h" #include "EIM02.h" #include "WaveOut.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CWaveOut char CWaveOut::m_szip[256] = {0}; IMPLEMENT_DYNCREATE(CWaveOut, CWinThread) CWaveOut::CWaveOut() { m_bChatting = FALSE; } CWaveOut::~CWaveOut() { } BOOL CWaveOut::InitInstance() { // TODO: perform and per-thread initialization here m_dwTID = ::GetCurrentThreadId(); m_bChatting = FALSE; // if (! Connect("127.0.0.1")) if (! Connect(m_szip)) return FALSE; if (! SendRequest()) return FALSE; if (! GetWavePCM()) return FALSE; /* if (! OpenFile("record3.wav")) return FALSE; */ if (! Start()) return FALSE; return TRUE; } int CWaveOut::ExitInstance() { // TODO: perform any per-thread cleanup here return CWinThread::ExitInstance(); } BEGIN_MESSAGE_MAP(CWaveOut, CWinThread) //{{AFX_MSG_MAP(CWaveOut) // NOTE - the ClassWizard will add and remove mapping macros here. ON_THREAD_MESSAGE(MM_WOM_OPEN, On_MM_Open) ON_THREAD_MESSAGE(MM_WOM_DONE, On_MM_Done) ON_THREAD_MESSAGE(MM_WOM_CLOSE, On_MM_Close) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CWaveOut message handlers /* BOOL CWaveOut::OpenFile(LPSTR name) { MMCKINFO pinfo; MMCKINFO cinfo; char *hData = NULL; //打开WAV文件,返回一个m_hmmio句柄 m_hmmio = mmioOpen(name, NULL, MMIO_READ); if (!m_hmmio) { AfxMessageBox("Wave file opening error."); return FALSE; } //查找父块"wave"; pinfo.fccType=mmioFOURCC('W','A','V','E'); if ( mmioDescend(m_hmmio, &pinfo, NULL, MMIO_FINDRIFF) ) { AfxMessageBox("mmioFOURCC failed."); return FALSE; } //查找子块"fmt" parent"riff"; cinfo.ckid=mmioFOURCC('f','m','t',' '); if(mmioDescend(m_hmmio,&cinfo,&pinfo,MMIO_FINDCHUNK)) { AfxMessageBox("mmioDescend failed."); return FALSE; } mmioRead(m_hmmio,(LPSTR)&m_pcm,sizeof(PCMWAVEFORMAT));//cinfo.cksize); if (m_pcm.wf.wFormatTag != WAVE_FORMAT_PCM) { AfxMessageBox("mmioDescend failed."); return FALSE; } //跳入块"FMT" mmioAscend(m_hmmio,&cinfo,0); //查找数据块 cinfo.ckid=mmioFOURCC('d','a','t','a'); if (mmioDescend(m_hmmio,&cinfo,&pinfo,MMIO_FINDCHUNK)) { AfxMessageBox("mmioDescend failed."); return FALSE; } m_dwSize =cinfo.cksize; return TRUE; } */ BOOL CWaveOut::Start() { if (waveOutOpen(&m_hwo, WAVE_MAPPER, (LPWAVEFORMATEX)&m_pcm, m_dwTID, 0, CALLBACK_THREAD)) { AfxMessageBox("waveOutOpen"); return FALSE; } return TRUE; } void CWaveOut::On_MM_Done(UINT wParam, LONG lParam) { LPWAVEHDR hdr = (LPWAVEHDR)lParam; delete [] hdr->lpData; // delete hdr; // AfxMessageBox("ttt"); // if (m_curSize < m_dwSize) ReadAndPlay(hdr); if (! m_bChatting) waveOutClose(m_hwo); } void CWaveOut::On_MM_Open(UINT wParam, LONG lParam) { m_bChatting = TRUE; ZeroMemory(&m_hdr1, sizeof(WAVEHDR)); ReadAndPlay(&m_hdr1); ZeroMemory(&m_hdr2, sizeof(WAVEHDR)); ReadAndPlay(&m_hdr2); } void CWaveOut::On_MM_Close(UINT wParam, LONG lParam) { // AfxMessageBox("On_MM_Close"); // mmioClose(m_hmmio, 0); closesocket(m_sock); Sleep(500); } /* BOOL CWaveOut::ReadAndPlay() { char *bbf = new char[BUF_LEN]; DWORD slen = recv(m_sock, bbf, BUF_LEN, 0); if (slen == SOCKET_ERROR) { AfxMessageBox("Teriable error."); return FALSE; } /* else { AfxMessageBox(bbf); }*/ // Sleep(10); /* LPWAVEHDR hdr = new WAVEHDR; char *buf = new char[BUF_LEN];*/ // ZeroMemory(hdr, sizeof(WAVEHDR)); /* DWORD total = 0; DWORD len = 0;*/ // len = mmioRead(m_hmmio, buf, BUF_LEN); /* m_curSize += len; hdr->lpData = bbf;//buf; hdr->dwBufferLength = slen;//len; if (waveOutPrepareHeader(m_hwo, hdr, sizeof(WAVEHDR))) { AfxMessageBox("waveOutPrepareHeader failed."); return FALSE; } if (waveOutWrite(m_hwo, hdr, sizeof(WAVEHDR))) { AfxMessageBox("waveOutWrite failed."); return FALSE; } return TRUE;*/ //} BOOL CWaveOut::ReadAndPlay(LPWAVEHDR hdr) { char *bbf = new char[BUF_LEN]; DWORD slen = recv(m_sock, bbf, BUF_LEN, 0); if (slen == SOCKET_ERROR) { // AfxMessageBox("Teriable error."); m_bChatting = FALSE; return FALSE; } hdr->lpData = bbf;//buf; hdr->dwBufferLength = slen;//len; if (waveOutPrepareHeader(m_hwo, hdr, sizeof(WAVEHDR))) { AfxMessageBox("waveOutPrepareHeader failed."); return FALSE; } if (waveOutWrite(m_hwo, hdr, sizeof(WAVEHDR))) { AfxMessageBox("waveOutWrite failed."); return FALSE; } return TRUE; } BOOL CWaveOut::Connect(LPSTR ip) { if(NULL == ip) { AfxMessageBox("CWaveSocket::Connect:ip == NULL."); return FALSE; } m_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (m_sock == INVALID_SOCKET) { AfxMessageBox("CWaveSocket::Connect [socket] failed."); return FALSE; } SOCKADDR_IN sin; sin.sin_addr.s_addr = inet_addr(ip); sin.sin_family = AF_INET; sin.sin_port = htons(VOICE_RECV_PORT); DWORD ret = connect(m_sock, (PSOCKADDR)&sin, sizeof(SOCKADDR_IN)); if (SOCKET_ERROR == ret) { AfxMessageBox("CWaveSocket::Connect [connect] failed."); return FALSE; } return TRUE; } BOOL CWaveOut::SendRequest() { int ret; ret = send(m_sock, "8888", 20, 0); if (SOCKET_ERROR == ret) { AfxMessageBox("Send failed."); } return TRUE; } BOOL CWaveOut::GetWavePCM() { int ret; ret = recv(m_sock, (char*)&m_pcm, sizeof(WAVEFORMATEX), 0); if (sizeof(WAVEFORMATEX) != ret) { AfxMessageBox("Get PCM failed."); return FALSE; } return TRUE; } BOOL CWaveOut::SetIP(LPCTSTR ip) { strcpy(m_szip, ip); return TRUE; } BOOL CWaveOut::Stop() { shutdown(m_sock, SD_BOTH); closesocket(m_sock); // AfxEndThread(1); // AfxMessageBox("aaaaaaa"); return TRUE; }